import json
import os

from click import prompt
from zhipuai import ZhipuAI

from dotenv import load_dotenv

from city_poi import get_city_code
from hot_weibo import query_weibo_hot_list
from weather import get_weather

load_dotenv()

apiKey = os.getenv("API_KEY")

from zhipuai import ZhipuAI

client = ZhipuAI(api_key=apiKey)  # 填写您自己的APIKey

prompt = '''
# 角色
你是一位专业的糖尿病健康专家，熟知各类食物的热量和糖分含量。能够准确地为用户提供指定食材的热量、糖分信息，并给出糖尿病人针对该食物的食用建议。

## 技能
### 技能 1：鉴定食物
1. 当用户提供一种食材时，使用专业知识和工具确定该食材的热量和糖分含量。回复示例：
=====
   - 🍎 食材名称：<食材名>
   - 🔥 热量：<具体热量数值>
   - 🍬 糖分：<具体糖分数值>
   - 💡 食用建议：<针对糖尿病人的食用建议，如适量食用、避免食用等>
=====

## 限制：
- 只回答与糖尿病相关的问题和食物鉴定。
- 对非糖尿病相关问题友好地拒绝回答。
- 所输出的内容必须按照给定的格式进行组织，不能偏离框架要求。
'''
prompt_wechat = '''
# 角色
你是一个贴心的 AI 助手，能够在用户不在的时候，及时、准确地回复微信消息，并尽力回答对方提出的问题。

## 技能
### 技能 1：回复微信消息
1. 当收到微信消息时，先判断消息的类型，是询问、请求、闲聊还是其他。
2. 根据消息类型，选择合适的回复语气和内容。回复示例：
=====
   👋 <具体的回复内容>
=====

### 技能 2：回答问题
1. 当对方提出问题时，使用工具搜索相关答案。
2. 如果搜索结果不确定，可以用较为模糊但礼貌的方式回复。回复示例：
=====
   👋 <对问题的回复，若不确定可加上“不太确定，仅供参考”等表述>
=====

## 限制：
- 只回复与微信消息相关的内容，拒绝回答与微信消息无关的问题。
- 所输出的内容必须按照给定的格式进行组织，不能偏离框架要求。
'''
prompt_weather = '''
# 角色
你是一个高效的智能助手，能够准确理解用户的问题并以清晰、易懂的正常文本进行回复。

## 技能
### 技能 1：回答问题
1. 当用户提出问题时，仔细分析问题的核心需求。
2. 使用知识库或搜索工具获取相关信息，确保回答准确且有依据。
3. 以正常文本形式回复用户，语言简洁明了。回复示例：<问题的回答内容>。

## 限制
- 只回答用户提出的问题，不进行无关的闲聊。
- 确保回答内容以正常文本呈现，不使用特殊格式或代码。
- 回答内容要准确、客观，不包含主观猜测或不确定的信息。
'''


def llm_response(messages):
    response = client.chat.completions.create(
        model="glm-4-plus",  # 填写需要调用的模型编码
        messages=messages,
        tools=[
            {
                "type": "function",
                "function": {
                    "name": "get_weather",
                    "description": "查询天气",
                    "parameters": {
                        "type": "object",
                        "properties": {
                            "city_code": {
                                "type": "number",
                                "description": "城市代码",
                            }
                        }
                    }
                }
            },
            {
                "type": "function",
                "function": {
                    "name": "get_city_code",
                    "description": "查询城市代码",
                    "parameters": {
                        "type": "object",
                        "properties": {
                            "city_name": {
                                "type": "string",
                                "description": "城市地区名称",
                            }
                        }
                    }
                }
            },
            {
                "type": "function",
                "function": {
                    "name": "query_weibo_hot_list",
                    "description": "查询微博热榜",
                    "parameters": {
                        "type": "object",
                        "properties": {
                        }
                    }
                }
            },
        ]
    )

    return response.choices[0].message


def llm_response_with_weather(question: str):
    print(question)
    messages = [
        {"role": "system", "content": prompt_weather},
        {"role": "user",
         "content": question}
    ]

    while True:
        message = llm_response(messages)
        if message.tool_calls is not None:
            for tool_call in message.tool_calls:
                if tool_call.function.name == "get_weather":
                    # 调用天气方法
                    arg = json.loads(tool_call.function.arguments)
                    result = get_weather(arg["city_code"])
                    print("===天气查询※函数返回===")
                    print(result)
                elif tool_call.function.name == "get_city_code":
                    # 调用天气方法
                    arg = json.loads(tool_call.function.arguments)
                    result = get_city_code(arg["city_name"])
                    print("===地区查询※函数返回===")
                    print(result)

                messages.append(
                    {
                        "tool_call_id": tool_call.id,  # 用于标识函数调用的 ID
                        "role": "tool",
                        "name": tool_call.function.name,
                        "content": str(result)  # 数值result 必须转成字符串
                    }
                )
        else:
            return message.content

def llm_response_with_weibo(question: str):
    print(question)
    messages = [
        {"role": "system", "content": prompt_weather},
        {"role": "user",
         "content": question}
    ]

    while True:
        message = llm_response(messages)
        if message.tool_calls is not None:
            for tool_call in message.tool_calls:
                if tool_call.function.name == "query_weibo_hot_list":
                    # 调用天气方法
                    result = query_weibo_hot_list()
                    print("===微博热榜查询※函数返回===")
                    # print(result)

                return result
                # messages.append(
                #     {
                #         "tool_call_id": tool_call.id,  # 用于标识函数调用的 ID
                #         "role": "tool",
                #         "name": tool_call.function.name,
                #         "content": str(result)  # 数值result 必须转成字符串
                #     }
                # )
        else:
            return message.content



def remove_edge_equals(s: str, flag: str) -> str:
    """
    该函数接收一个字符串，去除其开头和结尾的所有连续'='字符，并返回处理后的字符串。

    参数:
        s (str): 输入的原始字符串。

    返回:
        str: 去除了开头和结尾'='字符之后的字符串。
    """
    # 使用 strip() 方法并指定要去除的字符为 '='
    return s.strip(flag)


# print(llm_response_with_weibo("查询微博热榜"))
